package com.example.message.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;


/**
 * @author 小许
 * @Title:
 * @Package
 * @Description:
 * @date 2020/11/24-17:48
 */
@Configuration
public class RabbitMQConfig implements Ordered {
    /**
     * 订单死信队列交换机标识符  属性值不能改，写死
     */
    private static final String ORDER_DEAD_LETTER_QUEUE_KEY = "x-dead-letter-exchange";
    /**
     * 订单死信队列交换机绑定键 标识符  属性值不能改，写死
     */
    private static final String ORDER_DEAD_LETTER_ROUTING_KEY = "x-dead-letter-routing-key";
    //创建一个延时队列的名字
    public final static String DELAY_QUEUE ="delay_queue";
    //创建一个工作队列的名字
    public final static String PROCESS_QUEUE ="process_queue";
    //创建一个死信交换机的名字
    public final static String DELAY_EXCHANGE ="delay_exchange";
    //定义一个全局消息过期时间
    public final static int EXPIRE_TIME = 4000;

    //----------------------------订单死信定义------------------------------
    // 订单过期流程： 消息（创建的订单号）---》发送到订单死信队列，不消费（设置过期时间）---》（超过设定的过期时间）根据ORDER_DEAD_LETTER_QUEUE_KEY路由死信交换机 ---》重新消费，根据ORDER_DEAD_LETTER_ROUTING_KEY转发到转发队列（取出消息订单号查找订单，假如仍然未支付就取消订单）---》end

    /**
     * 声明一个订单死信队列.
     * x-dead-letter-exchange   对应  死信交换机
     * x-dead-letter-routing-key  对应 死信队列
     */
    @Bean
    Queue delayQueue(){
        return QueueBuilder.durable(DELAY_QUEUE)
                .withArgument(ORDER_DEAD_LETTER_QUEUE_KEY,DELAY_EXCHANGE)
                .withArgument(ORDER_DEAD_LETTER_ROUTING_KEY,PROCESS_QUEUE).build();
    }

    /**
     * 创建一个工作队列
     */
    @Bean
    Queue processQueue(){
        return QueueBuilder.durable(PROCESS_QUEUE).build();
    }


    /**
     * 创建一个死信交换机
     */
    @Bean
    DirectExchange delayExchange(){
        return new DirectExchange(DELAY_EXCHANGE);
    }

    /**
     * 完成工作队列和交换机的绑定
     */
    @Bean
    Binding delayExchangeBindQueue(Queue processQueue,DirectExchange delayExchange ){
        return BindingBuilder.bind(processQueue).to(delayExchange).with(PROCESS_QUEUE);
    }

    @Override
    public int getOrder() {
        return -100;
    }
}

